home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 February / EnigmA AMIGA RUN 04 (1996)(G.R. Edizioni)(IT)[!][issue 1996-02][Skylink CD III].iso / earcd / assembler / progasm1.lha / SORGENTI2 / LEZIONE6a.s < prev    next >
Text File  |  1994-07-21  |  6KB  |  221 lines

  1.  
  2. ; Lezione6a.s    STAMPIAMO UNA DEI CARATTERI SULLO SCHERMO!!!
  3.  
  4.     SECTION    CiriCop,CODE
  5.  
  6. Inizio:
  7.     move.l    4.w,a6        ; Execbase in a6
  8.     jsr    -$78(a6)    ; Disable - ferma il multitasking
  9.     lea    GfxName(PC),a1    ; Indirizzo del nome della lib da aprire in a1
  10.     jsr    -$198(a6)    ; OpenLibrary
  11.     move.l    d0,GfxBase    ; salvo l'indirizzo base GFX in GfxBase
  12.     move.l    d0,a6
  13.     move.l    $26(a6),OldCop    ; salviamo l'indirizzo della copperlist vecchia
  14.  
  15. ;     PUNTIAMO IL NOSTRO BITPLANE
  16.  
  17.     MOVE.L    #BITPLANE,d0    ; in d0 mettiamo l'indirizzo della PIC,
  18.     LEA    BPLPOINTERS,A1    ; puntatori nella COPPERLIST
  19.     move.w    d0,6(a1)    ; copia la word BASSA dell'indirizzo del plane
  20.     swap    d0        ; scambia le 2 word di d0 (es: 1234 > 3412)
  21.     move.w    d0,2(a1)    ; copia la word ALTA dell'indirizzo del plane
  22.  
  23.     move.l    #COPPERLIST,$dff080    ; Puntiamo la nostra COP
  24.     move.w    d0,$dff088        ; Facciamo partire la COP
  25.     move.w    #0,$dff1fc        ; Disattiva l'AGA
  26.     move.w    #$c00,$dff106        ; Disattiva l'AGA
  27.  
  28.     bsr.w    print        ; Stampa una parola sullo schermo
  29.  
  30. mouse:
  31.     btst    #6,$bfe001    ; tasto sinistro del mouse premuto?
  32.     bne.s    mouse        ; se no, torna a mouse:
  33.  
  34.     move.l    OldCop(PC),$dff080    ; Puntiamo la cop di sistema
  35.     move.w    d0,$dff088        ; facciamo partire la vecchia cop
  36.  
  37.     move.l    4.w,a6
  38.     jsr    -$7e(a6)    ; Enable - riabilita il Multitasking
  39.     move.l    gfxbase(PC),a1    ; Base della libreria da chiudere
  40.     jsr    -$19e(a6)    ; Closelibrary - chiudo la graphics lib
  41.     rts            ; USCITA DAL PROGRAMMA
  42.  
  43. ;    Dati
  44.  
  45. GfxName:
  46.     dc.b    "graphics.library",0,0
  47.  
  48. GfxBase:        ; Qua ci va l'indirizzo di base per gli Offset
  49.     dc.l    0    ; della graphics.library
  50.  
  51. OldCop:            ; Qua ci va l'indirizzo della vecchia COP di sistema
  52.     dc.l    0
  53.  
  54. ;    Routine che stampa caratteri larghi 8x8 pixel
  55.  
  56. TESTO:
  57.     dc.b    'A'    ; il testo da stampare. Qua solo una "A", ossia $41
  58.  
  59.     EVEN    ; allinea a indirizzo pari
  60.  
  61.  
  62. PRINT:
  63.     LEA    TESTO(PC),A0    ; Indirizzo del testo da stampare in a0
  64.     LEA    BITPLANE,A3    ; Indirizzo del bitplane destinazione in a3
  65.     MOVEQ    #0,D2        ; Pulisci d2
  66.     MOVE.B    (A0),D2        ; Prossimo carattere in d2
  67.     SUB.B    #$20,D2        ; TOGLI 32 AL VALORE ASCII DEL CARATTERE, IN
  68.                 ; MODO DA TRASFORMARE, AD ESEMPIO, QUELLO
  69.                 ; DELLO SPAZIO (che e' $20), in $00, quello
  70.                 ; DELL'ASTERISCO ($21), in $01...
  71.     MULU.W    #8,D2        ; MOLTIPLICA PER 8 IL NUMERO PRECEDENTE,
  72.                 ; essendo i caratteri alti 8 pixel
  73.     MOVE.L    D2,A2
  74.     ADD.L    #FONT,A2    ; TROVA IL CARATTERE DESIDERATO NEL FONT...
  75.  
  76.                 ; STAMPIAMO IL CARATTERE LINEA PER LINEA
  77.     MOVE.B    (A2)+,(A3)    ; stampa LA LINEA 1 del carattere
  78.     MOVE.B    (A2)+,40(A3)    ; stampa LA LINEA 2  " "
  79.     MOVE.B    (A2)+,40*2(A3)    ; stampa LA LINEA 3  " "
  80.     MOVE.B    (A2)+,40*3(A3)    ; stampa LA LINEA 4  " "
  81.     MOVE.B    (A2)+,40*4(A3)    ; stampa LA LINEA 5  " "
  82.     MOVE.B    (A2)+,40*5(A3)    ; stampa LA LINEA 6  " "
  83.     MOVE.B    (A2)+,40*6(A3)    ; stampa LA LINEA 7  " "
  84.     MOVE.B    (A2)+,40*7(A3)    ; stampa LA LINEA 8  " "
  85.  
  86.     RTS
  87.  
  88.  
  89.  
  90.     SECTION    GRAPHIC,DATA_C
  91.  
  92. COPPERLIST:
  93.     dc.w    $120,$0000,$122,$0000,$124,$0000,$126,$0000,$128,$0000 ; SPRITE
  94.     dc.w    $12a,$0000,$12c,$0000,$12e,$0000,$130,$0000,$132,$0000
  95.     dc.w    $134,$0000,$136,$0000,$138,$0000,$13a,$0000,$13c,$0000
  96.     dc.w    $13e,$0000
  97.  
  98.     dc.w    $8E,$2c81    ; DiwStrt
  99.     dc.w    $90,$2cc1    ; DiwStop
  100.     dc.w    $92,$0038    ; DdfStart
  101.     dc.w    $94,$00d0    ; DdfStop
  102.     dc.w    $102,0        ; BplCon1
  103.     dc.w    $104,0        ; BplCon2
  104.     dc.w    $108,0        ; Bpl1Mod
  105.     dc.w    $10a,0        ; Bpl2Mod
  106.             ; 5432109876543210
  107.     dc.w    $100,%0001001000000000    ; 1 bitplane LOWRES 320x256
  108.  
  109. BPLPOINTERS:
  110.     dc.w $e0,$0000,$e2,$0000    ;primo     bitplane
  111.  
  112.     dc.w    $0180,$000    ; color0 - SFONDO
  113.     dc.w    $0182,$19a    ; color1 - SCRITTE
  114.  
  115.  
  116.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  117.  
  118. ;    Il FONT caratteri 8x8
  119.  
  120. FONT:
  121.     incbin    "nice.fnt"    ; senza caratteri ALT
  122.  
  123.     SECTION    MIOPLANE,BSS_C    ; Le SECTION BSS devono essere fatte di
  124.                 ; soli ZERI!!! si usa il DS.b per definire
  125.                 ; quanti zeri contenga la section.
  126.  
  127. BITPLANE:
  128.     ds.b    40*256    ; un bitplane lowres 320x256
  129.  
  130.     end
  131.  
  132. Una "A" e' apparsa sul nostro monitor!!! Nell'angolo in alto a sinistra.
  133. Potete cambiare parola da stampare, ma non e' una grande modifica stampare
  134. una "B" anziche' una "A".
  135.  
  136. * MODIFICA 1:
  137.  
  138. Provate a far stampare solo meta' carattere, ossia le sue prime 4 linee:
  139.  
  140.  
  141.     MOVE.B    (A2)+,(A3)    ; stampa LA LINEA 1 del carattere
  142.     MOVE.B    (A2)+,40(A3)    ; stampa LA LINEA 2  " "
  143.     MOVE.B    (A2)+,40*2(A3)    ; stampa LA LINEA 3  " "
  144.     MOVE.B    (A2)+,40*3(A3)    ; stampa LA LINEA 4  " "
  145. ;    MOVE.B    (A2)+,40*4(A3)    ; stampa LA LINEA 5  " "
  146. ;    MOVE.B    (A2)+,40*5(A3)    ; stampa LA LINEA 6  " "
  147. ;    MOVE.B    (A2)+,40*6(A3)    ; stampa LA LINEA 7  " "
  148. ;    MOVE.B    (A2)+,40*7(A3)    ; stampa LA LINEA 8  " "
  149.  
  150. Ogni linea e' un byte, ossia 8 BIT
  151.  
  152.     12345678
  153.  
  154.     ...###.. linea    1 - 8 bit, 1 byte
  155.     ..#...#. 2
  156.     ..#...#. 3
  157.     ..#####. 4
  158.     ..#...#. 5
  159.     ..#...#. 6
  160.     ..#...#. 7
  161.     ........ 8
  162.  
  163. * MODIFICA 2:
  164.  
  165. Provate a togliere l'EVEN dalla stringa:
  166.  
  167.     dc.b    "A"
  168.  
  169. Assemblando l'ASMONE vi comunichera' l'errore: "Word at ODD address", ossia
  170. "INDIRIZZO DISPARI!!". Bastera' rimettere lo zero a posto o aggiungere EVEN.
  171.  
  172.  
  173. * MODIFICA 3:
  174.  
  175. Per cambiare la posizione della "A" basta cambiare la destinazione del PRINT:
  176.  
  177. PRINT:
  178.     LEA    TESTO(PC),A0
  179.     LEA    BITPLANE+(40*120),A3 ; Indirizzo destinazione
  180.  
  181. In questo modo stampiamo 120 linee piu' in basso, al centro dello schermo.
  182. Per far avanzare il carattere basta aggiungere dei bytes:
  183.  
  184.     LEA    BITPLANE+19+(40*120),A3 ; Indirizzo destinazione
  185.  
  186. In questo modo lo facciamo avanzare di 19 bytes, e viene stampato al ventesimo
  187. byte, la meta' dello schermo (che e' di 40 bytes).
  188.  
  189. * MODIFICA 4:
  190.  
  191. Proviamo a visualizzare il carattere in un bitplane in HIRES: Per fare cio'
  192. eseguite queste modifiche:
  193.  
  194. Nella routine, essendo lo schermo hires largo 80 byte per linea anziche' 40:
  195.  
  196.     MOVE.B    (A2)+,(A3)    ; stampa LA LINEA 1 del carattere
  197.     MOVE.B    (A2)+,80(A3)    ; stampa LA LINEA 2  " "
  198.     MOVE.B    (A2)+,80*2(A3)    ; stampa LA LINEA 3  " "
  199.     MOVE.B    (A2)+,80*3(A3)    ; stampa LA LINEA 4  " "
  200.     MOVE.B    (A2)+,80*4(A3)    ; stampa LA LINEA 5  " "
  201.     MOVE.B    (A2)+,80*5(A3)    ; stampa LA LINEA 6  " "
  202.     MOVE.B    (A2)+,80*6(A3)    ; stampa LA LINEA 7  " "
  203.     MOVE.B    (A2)+,80*7(A3)    ; stampa LA LINEA 8  " "
  204.  
  205. Nella copperlist: settare il BIT 15 in BPLCON0, attivando l'HIRES
  206.  
  207.             ; 5432109876543210
  208.     dc.w    $100,%1001001000000000    ; 1 bitplane HIRES 640x256
  209.  
  210. E modificare il DDFSTART/DDFSTOP per lo schermo HIRES, pena il "TAGLIO" delle
  211. prime linee a sinistra. Se non modificate questi due registri infatti la "A"
  212. non viene visualizzata se e' al bordo sinistro.
  213.  
  214.     dc.w    $92,$003c    ; DdfStart HIRES normale
  215.     dc.w    $94,$00d4    ; DdfStop HIRES normale
  216.  
  217. Infine nella SECTION BSS: dobbiamo ingrandire il BITPLANE!
  218.  
  219.     ds.b    80*256    ; un bitplane hires 640x256
  220.  
  221.